/*
 * Bullet.cpp
 *
 *  Created on: 31/10/2011
 *      Author: andrea
 */

#include "Bullet.h"

Bullet::Bullet(){}

Bullet::Bullet(int posX, int posY, Widget *parent, double angle,SDL_Surface* surface) :
		Widget(posX, posY, parent) {

	bullet = surface;
	parcel = getPosition();

	std::stringstream ss;
	ss << "x = " << parcel.posX << " y = " << parcel.posY;

	Logger::log("bullet", "constructor", &ss);

	parcel.height = bullet->h;
	parcel.width = bullet->w;

	this->angle = angle;
	this->drawable = true;

	setPosition();
	nextX = parcel.posX;
	nextY = parcel.posY;

	setDeltha();
}

void Bullet::handleEvent(Event event) {
	//No hace nada por ahora.. capaz màs adelante con las colisiones
}

void Bullet::resolve() {
	if (drawable) {
		// Calculo pròximo x e y..
		nextX +=3* delthaX;
		nextY +=3* delthaY;
	}
	//	Verificar si sigue siendo dibujable
	// Revisar esta cuenta
	if ((nextX > 10 && nextX + parcel.width < 810)
			&& (nextY > 10 && nextY + parcel.height < 610)) {
		parcel.posX = nextX;
		parcel.posY = nextY;
	} else {
		drawable = false;
	}

}

void Bullet::showOn(SDL_Surface* surface) {
	if (!drawable) {
		return;
	}

	SDL_Rect rect;
	rect.x = parcel.posX;
	rect.y = parcel.posY;
	rect.w = parcel.width;
	rect.h = parcel.height;
	SDL_BlitSurface(bullet, NULL, surface, &rect);
}

bool Bullet::isDrawable() {
	return drawable;
}

Bullet::~Bullet() {
	SDL_FreeSurface(bullet);
}

void Bullet::setDeltha() {
	if ((angle >= 0.0) && (angle <= 90.0)) {

		delthaY = (-(angle / 10));
		delthaX = delthaY + 9;

	} else if ((angle > 90.0) && (angle <= 180.0)) {

		delthaX = (-(angle - 90)) / 10;
		delthaY = -delthaX - 9;

	} else if ((angle > 180) && (angle <= 270)) {

		delthaY = (angle - 180) / 10;
		delthaX = delthaY - 9;

	} else if ((angle >= 270) && (angle <= 360)) {

		delthaX = ((angle - 270) / 10);
		delthaY = -delthaX + 9;

	}
}

void Bullet::setPosition() {
	int angulo = (int) angle;

	if ((angulo >= 0) && (angulo <= 40)) {
		parcel.posX = parcel.posX + 15;
		parcel.posY = parcel.posY + (-angulo) * 3 / 10;

		std::stringstream ss;
		ss << "x = " << parcel.posX << " y = " << parcel.posY;

		Logger::log("bullet", "setPosition", &ss);
	}

	if ((angulo > 40) && (angulo <= 130)) {
		parcel.posX = parcel.posX + (-(angulo - 90)) * 3 / 10;
		parcel.posY = parcel.posY - 15;

		std::stringstream ss;
		ss << "x = " << parcel.posX << " y = " << parcel.posY;

		Logger::log("bullet", "setPosition", &ss);
	}

	if ((angulo > 130) && (angulo <= 180)) {
		parcel.posX = parcel.posX - 15;
		parcel.posY = parcel.posY + (-(angulo - 180)) * 3 / 10;

		std::stringstream ss;
		ss << "x = " << parcel.posX << " y = " << parcel.posY;

		Logger::log("bullet", "setPosition", &ss);
	}

	if ((angulo > 180) && (angulo <= 220)) {
		parcel.posX = parcel.posX - 15;
		parcel.posY = parcel.posY + (angulo - 180) * 3 / 10;

		std::stringstream ss;
		ss << "x = " << parcel.posX << " y = " << parcel.posY;

		Logger::log("bullet", "setPosition", &ss);
	}

	if ((angulo > 220) && (angulo <= 310)) {
		parcel.posX = parcel.posX + (angulo - 270) * 3 / 10;
		parcel.posY = parcel.posY + 15;

		std::stringstream ss;
		ss << "x = " << parcel.posX << " y = " << parcel.posY;

		Logger::log("bullet", "setPosition", &ss);
	}

	if ((angulo > 310) && (angulo <= 360)) {
		parcel.posX = parcel.posX + 15;
		parcel.posY = parcel.posY + (-(angulo - 360)) * 3 / 10;

		std::stringstream ss;
		ss << "x = " << parcel.posX << " y = " << parcel.posY;

		Logger::log("bullet", "setPosition", &ss);
	}
}
